﻿
#ifndef GamePadState_h
#define GamePadState_h

#include <System/String.h>

#include <Riccsson/Xna/Framework/Vector3.h>
#include <Riccsson/Xna/Framework/Input/GamePadThumbSticks.h>
#include <Riccsson/Xna/Framework/Input/GamePadTriggers.h>
#include <Riccsson/Xna/Framework/Input/GamePadButtons.h>
#include <Riccsson/Xna/Framework/Input/GamePadDPad.h>

namespace Riccsson
{
	namespace Xna
	{
		namespace Framework
		{
			namespace Input
			{
				// Summary:
				//     Represents specific information about the state of an Xbox 360 Controller,
				//     including the current state of buttons and sticks. Reference page contains
				//     links to related code samples.
				struct GamePadState : public Riccsson::System::object
				{
					PROP3GET(GamePadState, GamePadButtons, buttons);
					PROP3GET(GamePadState, GamePadDPad, DPad);
					PROP3GET(GamePadState, bool, IsConnected);
					PROP3GET(GamePadState, int, PacketNumber);
					PROP3GET(GamePadState, GamePadThumbSticks, ThumbSticks);
					PROP3GET(GamePadState, GamePadTriggers, Triggers);
					
					COPY_CONSTRUCTOR(GamePadState)
					{
						PROP3GET_INIT_COPY(GamePadState, GamePadButtons, buttons);
						PROP3GET_INIT_COPY(GamePadState, GamePadDPad, DPad);
						PROP3GET_INIT_COPY(GamePadState, bool, IsConnected);
						PROP3GET_INIT_COPY(GamePadState, int, PacketNumber);
						PROP3GET_INIT_COPY(GamePadState, GamePadThumbSticks, ThumbSticks);
						PROP3GET_INIT_COPY(GamePadState, GamePadTriggers, Triggers);
					}

					//
					// Summary:
					//     Initializes a new instance of the GamePadState class using the specified
					//     GamePadThumbSticks, GamePadTriggers, GamePadButtons, and GamePadDPad.
					//
					// Parameters:
					//   thumbSticks:
					//     Initial thumbstick state.
					//
					//   triggers:
					//     Initial trigger state.
					//
					//   buttons:
					//     Initial button state.
					//
					//   dPad:
					//     Initial directional pad state.
					public: GamePadState(GamePadThumbSticks thumbSticks, GamePadTriggers triggers, GamePadButtons buttons, GamePadDPad dPad)
						: PROP3GET_INIT(GamePadState, buttons)
						, PROP3GET_INIT(GamePadState, DPad)
						, PROP3GET_INIT(GamePadState, IsConnected)
						, PROP3GET_INIT(GamePadState, PacketNumber)
						, PROP3GET_INIT(GamePadState, ThumbSticks)
						, PROP3GET_INIT(GamePadState, Triggers)
					{
						throw;
					}
					//
					// Summary:
					//     Initializes a new instance of the GamePadState class with the specified stick,
					//     trigger, and button values.
					//
					// Parameters:
					//   leftThumbStick:
					//     Left stick value. Each axis is clamped between −1.0 and 1.0.
					//
					//   rightThumbStick:
					//     Right stick value. Each axis is clamped between −1.0 and 1.0.
					//
					//   leftTrigger:
					//     Left trigger value. This value is clamped between 0.0 and 1.0.
					//
					//   rightTrigger:
					//     Right trigger value. This value is clamped between 0.0 and 1.0.
					//
					//   buttons:
					//     Array or parameter list of Buttons to initialize as pressed.
					public: GamePadState(Vector2 leftThumbStick, Vector2 rightThumbStick, float leftTrigger, float rightTrigger, Riccsson::System::Array<Buttons>* buttons)
						: PROP3GET_INIT(GamePadState, buttons)
						, PROP3GET_INIT(GamePadState, DPad)
						, PROP3GET_INIT(GamePadState, IsConnected)
						, PROP3GET_INIT(GamePadState, PacketNumber)
						, PROP3GET_INIT(GamePadState, ThumbSticks)
						, PROP3GET_INIT(GamePadState, Triggers)
					{
						throw;
					}

					// Summary:
					//     Returns a structure that identifies what buttons on the Xbox 360 controller
					//     are pressed. Reference page contains links to related code samples.
					public: PROP3_GET(GamePadButtons, buttons)
					{
						throw;
					}
					//
					// Summary:
					//     Returns a structure that identifies what directions of the directional pad
					//     on the Xbox 360 Controller are pressed.
					public: PROP3_GET(GamePadDPad, DPad)
					{
						throw;
					}
					//
					// Summary:
					//     Indicates whether the Xbox 360 Controller is connected. Reference page contains
					//     links to related code samples.
					public: PROP3_GET(bool, IsConnected)
					{
						throw;
					}
					//
					// Summary:
					//     Gets the packet number associated with this state. Reference page contains
					//     links to related code samples.
					public: PROP3_GET(int, PacketNumber)
					{
						throw;
					}
					//
					// Summary:
					//     Returns a structure that indicates the position of the Xbox 360 Controller
					//     sticks (thumbsticks).
					public: PROP3_GET(GamePadThumbSticks, ThumbSticks)
					{
						throw;
					}
					//
					// Summary:
					//     Returns a structure that identifies the position of triggers on the Xbox
					//     360 controller.
					public: PROP3_GET(GamePadTriggers, Triggers)
					{
						throw;
					}

					// Summary:
					//     Returns a value that indicates whether the current instance is equal to a
					//     specified object.
					//
					// Parameters:
					//   obj:
					//     Object with which to make the comparison.
					public: override bool Equals(Riccsson::System::object* obj)
					{
						throw;
					}
					//
					// Summary:
					//     Gets the hash code for this instance.
					public: override int GetHashCode()
					{
						throw;
					}
					//
					// Summary:
					//     Determines whether specified input device buttons are pressed in this GamePadState.
					//
					// Parameters:
					//   button:
					//     Buttons to query. Specify a single button, or combine multiple buttons using
					//     a bitwise OR operation.
					public: bool IsButtonDown(Buttons button)
					{
						throw;
					}
					//
					// Summary:
					//     Determines whether specified input device buttons are up (not pressed) in
					//     this GamePadState.
					//
					// Parameters:
					//   button:
					//     Buttons to query. Specify a single button, or combine multiple buttons using
					//     a bitwise OR operation.
					public: bool IsButtonUp(Buttons button)
					{
						throw;
					}
					//
					// Summary:
					//     Retrieves a string representation of this object.
					public: override GC_PTR<Riccsson::System::string> ToString()
					{
						throw;
					}
				};
				
				// Summary:
				//     Determines whether two GamePadState instances are not equal.
				//
				// Parameters:
				//   left:
				//     Object on the left of the equal sign.
				//
				//   right:
				//     Object on the right of the equal sign.
				static bool operator !=(GamePadState left, GamePadState right)
				{
					throw;
				}
				//
				// Summary:
				//     Determines whether two GamePadState instances are equal.
				//
				// Parameters:
				//   left:
				//     Object on the left of the equal sign.
				//
				//   right:
				//     Object on the right of the equal sign.
				static bool operator ==(GamePadState left, GamePadState right)
				{
					throw;
				}
			}
		}
	}
}

#endif